package fr.neamar.kiss.loader;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.LauncherActivityInfo;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.preference.PreferenceManager;
import android.os.Build;
import android.os.Process;
import android.os.UserManager;
import android.util.Log;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import fr.neamar.kiss.KissApplication;
import fr.neamar.kiss.TagsHandler;
import fr.neamar.kiss.pojo.AppPojo;
import fr.neamar.kiss.utils.UserHandle;
public class LoadAppPojos extends LoadPojos<AppPojo> {
private TagsHandler tagsHandler;
private static SharedPreferences prefs;
public LoadAppPojos(Context context) {
super(context, "app://");
prefs = PreferenceManager.getDefaultSharedPreferences(context);
tagsHandler = KissApplication.getDataHandler(context).getTagsHandler();
}
@Override
protected ArrayList<AppPojo> doInBackground(Void... params) {
long start = System.nanoTime();
ArrayList<AppPojo> apps = new ArrayList<>();
String excludedAppList = PreferenceManager.getDefaultSharedPreferences(context).
getString("excluded-apps-list", context.getPackageName() + ";");
List excludedApps = Arrays.asList(excludedAppList.split(";"));
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
UserManager manager = (UserManager) context.getSystemService(Context.USER_SERVICE);
LauncherApps launcher = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
// Handle multi-profile support introduced in Android 5 (#542)
for (android.os.UserHandle profile : manager.getUserProfiles()) {
UserHandle user = new UserHandle(manager.getSerialNumberForUser(profile), profile);
for (LauncherActivityInfo activityInfo : launcher.getActivityList(null, profile)) {
ApplicationInfo appInfo = activityInfo.getApplicationInfo();
String fullPackageName = user.addUserSuffixToString(appInfo.packageName, '#');
if(!excludedApps.contains(fullPackageName)) {
AppPojo app = new AppPojo();
app.id = user.addUserSuffixToString(pojoScheme + appInfo.packageName + "/" + activityInfo.getName(), '/');
app.setName(activityInfo.getLabel().toString());
app.packageName = appInfo.packageName;
app.activityName = activityInfo.getName();
// Wrap Android user handle in opaque container that will work across
// all Android versions
app.userHandle = user;
app.setTags(tagsHandler.getTags(app.id));
apps.add(app);
}
}
}
} else {
PackageManager manager = context.getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
for (ResolveInfo info : manager.queryIntentActivities(mainIntent, 0)) {
ApplicationInfo appInfo = info.activityInfo.applicationInfo;
if (!excludedApps.contains(appInfo.packageName)) {
AppPojo app = new AppPojo();
app.id = pojoScheme + appInfo.packageName + "/" + info.activityInfo.name;
app.setName(info.loadLabel(manager).toString());
app.packageName = appInfo.packageName;
app.activityName = info.activityInfo.name;
app.userHandle = new UserHandle();
app.setTags(tagsHandler.getTags(app.id));
apps.add(app);
}
}
}
// Apply app sorting preference
if (prefs.getString("sort-apps", "alphabetical").equals("invertedAlphabetical")) {
Collections.sort(apps, Collections.reverseOrder(new AppPojo.NameComparator()));
} else {
Collections.sort(apps, new AppPojo.NameComparator());
}
long end = System.nanoTime();
Log.i("time", Long.toString((end - start) / 1000000) + " milliseconds to list apps");
return apps;
}
}